ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGlfcGNpMTQxMGEuYyBiL2RyaXZlcnMvdGlfcGNpMTQxMGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmIxYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy90aV9wY2kxNDEwYS5jCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG90cyBvZiBjb2RlIGNvcGllZCBmcm9tOgorICoKKyAqIG04eHhfcGNtY2lhLmMgLSBMaW51eCBQQ01DSUEgc29ja2V0IGRyaXZlciBmb3IgdGhlIG1wYzh4eCBzZXJpZXMuCisgKiAoQykgMTk5OS0yMDAwIE1hZ251cyBEYW1tIDxkYW1tQGJpdHNtYXJ0LmNvbT4KKyAqCisgKiAiVGhlIEV4Q0Egc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgc29ja2V0IGNvbnRyb2xsZXJzIHNob3VsZCBwcm92aWRlCisgKiB0d28gSU8gYW5kIGZpdmUgbWVtb3J5IHdpbmRvd3MgcGVyIHNvY2tldCwgd2hpY2ggY2FuIGJlIGluZGVwZW5kZW50bHkKKyAqIGNvbmZpZ3VyZWQgYW5kIHBvc2l0aW9uZWQgaW4gdGhlIGhvc3QgYWRkcmVzcyBzcGFjZSBhbmQgbWFwcGVkIHRvCisgKiBhcmJpdHJhcnkgc2VnbWVudHMgb2YgY2FyZCBhZGRyZXNzIHNwYWNlLiAiIC0gRGF2aWQgQSBIaW5kcy4gMTk5OQorICoKKyAqIFRoaXMgY29udHJvbGxlciBkb2VzIF9ub3RfIG1lZXQgdGhlIEV4Q0Egc3RhbmRhcmQuCisgKgorICogbTh4eCBwY21jaWEgY29udHJvbGxlciBicmllZiBpbmZvOgorICogKyA4IHdpbmRvd3MgKGF0dHJpYiwgbWVtLCBpL28pCisgKiArIHVwIHRvIHR3byBzbG90cyAoU0xPVF9BIGFuZCBTTE9UX0IpCisgKiArIGlucHV0cGlucywgb3V0cHV0cGlucywgZXZlbnQgYW5kIG1hc2sgcmVnaXN0ZXJzLgorICogLSBubyBvZmZzZXQgcmVnaXN0ZXIuIHNpZ2guCisgKgorICogQmVjYXVzZSBvZiB0aGUgbGFja2luZyBvZmZzZXQgcmVnaXN0ZXIgd2UgbXVzdCBtYXAgdGhlIHdob2xlIGNhcmQuCisgKiBXZSBhc3NpZ24gZWFjaCBtZW1vcnkgd2luZG93IFBDTUNJQV9NRU1fV0lOX1NJWkUgYWRkcmVzcyBzcGFjZS4KKyAqIE1ha2Ugc3VyZSB0aGVyZSBpcyAoUENNQ0lBX01FTV9XSU5fU0laRSAqIFBDTUNJQV9NRU1fV0lOX05PCisgKiAqIFBDTUNJQV9TT0NLRVRTX05PKSBieXRlcyBhdCBQQ01DSUFfTUVNX1dJTl9CQVNFLgorICogVGhlIGkvbyB3aW5kb3dzIGFyZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXQgUENNQ0lBX0lPX1dJTl9CQVNFLgorICogVGhleSBhcmUgbWF4aW11bSA2NEtCeXRlIGVhY2guLi4KKyAqLworCisKKyN1bmRlZiBERUJVRwkJLyoqLworCisvKgorICogUENNQ0lBIHN1cHBvcnQKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPHBjbWNpYS5oPgorI2luY2x1ZGUgPGNtZF9wY21jaWEuaD4KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1BDTUNJQSkgJiYgZGVmaW5lZChDT05GSUdfSURFX1RJX0NBUkRCVVMpCisKK2ludCBwY21jaWFfb24oaW50IGlkZV9iYXNlX2J1cyk7CisKK3N0YXRpYyBpbnQgIHBjbWNpYV9vZmYodm9pZCk7CitzdGF0aWMgaW50ICBoYXJkd2FyZV9kaXNhYmxlKGludCBzbG90KTsKK3N0YXRpYyBpbnQgIGhhcmR3YXJlX2VuYWJsZShpbnQgc2xvdCk7CitzdGF0aWMgaW50ICB2b2x0YWdlX3NldChpbnQgc2xvdCwgaW50IHZjYywgaW50IHZwcCk7CitzdGF0aWMgdm9pZCBwcmludF9mdW5jaWQoaW50IGZ1bmMpOworc3RhdGljIHZvaWQgcHJpbnRfZml4ZWQodm9sYXRpbGUgdWNoYXIgKnApOworc3RhdGljIGludCAgaWRlbnRpZnkodm9sYXRpbGUgdWNoYXIgKnApOworc3RhdGljIGludCAgY2hlY2tfaWRlX2RldmljZShpbnQgc2xvdCwgaW50IGlkZV9iYXNlX2J1cyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK2NvbnN0IGNoYXIgKmluZGVudCA9ICJcdCAgICI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitpbnQgZG9fcGluaXQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWZuZGVmIENGR19GSVNSVF9QQ01DSUFfQlVTCisjIGRlZmluZSBDRkdfRklTUlRfUENNQ0lBX0JVUyAwCisjZW5kaWYKKworCWludCByY29kZSA9IDA7CisJCisJaWYgKGFyZ2MgIT0gMikgeworCQlwcmludGYgKCJVc2FnZTogcGluaXQge29uIHwgb2ZmfVxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoc3RyY21wKGFyZ3ZbMV0sIm9uIikgPT0gMCkgeworCQlyY29kZSA9IHBjbWNpYV9vbihDRkdfRklTUlRfUENNQ0lBX0JVUyk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwib2ZmIikgPT0gMCkgeworCQlyY29kZSA9IHBjbWNpYV9vZmYoKTsKKwl9IGVsc2UgeworCQlwcmludGYgKCJVc2FnZTogcGluaXQge29uIHwgb2ZmfVxuIik7CisJCXJldHVybiAxOworCX0KKwkKKwlyZXR1cm4gcmNvZGU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc3VwcG9ydGVkW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1RJLCAweGFjNTAgfSwgLyogVGkgUENJMTQxMEEgKi8KKwl7IFBDSV9WRU5ET1JfSURfVEksIDB4YWM1NiB9LCAvKiBUaSBQQ0kxNTEwICovCisJeyB9Cit9OworCitzdGF0aWMgcGNpX2Rldl90IGRldmJ1c2ZuOworc3RhdGljIHUzMiBzb2NrZXRfYmFzZTsKK3N0YXRpYyB1MzIgcGNtY2lhX2Npc19wdHI7CisKK2ludCBwY21jaWFfb24oaW50IGlkZV9iYXNlX2J1cykKK3sJCisJdTE2IGRldl9pZDsKKwl1MzIgc29ja2V0X3N0YXR1czsKKwlpbnQgc2xvdCA9IDA7CisJaW50IGNpc19sZW47CisJdTE2IGlvX2Jhc2U7CisJdTE2IGlvX2xlbjsKKwkKKwkvKgorCSAqIEZpbmQgdGhlIENhcmRCdXMgUENJIGRldmljZShzKS4KKwkgKi8KKwlpZiAoKGRldmJ1c2ZuID0gcGNpX2ZpbmRfZGV2aWNlcyhzdXBwb3J0ZWQsIDApKSA8IDApIHsKKwkJcHJpbnRmKCJUaSBDYXJkQnVzOiBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2YnVzZm4sIFBDSV9ERVZJQ0VfSUQsICZkZXZfaWQpOworCQorCWlmIChkZXZfaWQgPT0gMHhhYzU2KSB7CisJCWRlYnVnKCJFbmFibGUgUENNQ0lBIFRpIFBDSTE1MTBcbiIpOworCX0gZWxzZSB7CisJCWRlYnVnKCJFbmFibGUgUENNQ0lBIFRpIFBDSTE0MTBBXG4iKTsKKwl9CisKKwlwY21jaWFfY2lzX3B0ciA9IENGR19QQ01DSUFfQ0lTX1dJTjsKKwljaXNfbGVuID0gQ0ZHX1BDTUNJQV9DSVNfV0lOX1NJWkU7CisKKwlpb19iYXNlID0gQ0ZHX1BDTUNJQV9JT19XSU47CisJaW9fbGVuID0gQ0ZHX1BDTUNJQV9JT19XSU5fU0laRTsJCisKKwkvKgorCSAqIFNldHVwIHRoZSBQQ0kgZGV2aWNlLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXZidXNmbiwgUENJX0JBU0VfQUREUkVTU18wLCAmc29ja2V0X2Jhc2UpOworCXNvY2tldF9iYXNlICY9IH4weGY7CisKKwlzb2NrZXRfc3RhdHVzID0gcmVhZGwoc29ja2V0X2Jhc2UrOCk7CisJaWYgKChzb2NrZXRfc3RhdHVzICYgNikgPT0gMCkgeworCQlwcmludGYoIkNhcmQgUHJlc2VudDogIik7CisJCQorCQlzd2l0Y2ggKHNvY2tldF9zdGF0dXMgJiAweDNjMDApIHsKKwkJCQorCQljYXNlIDB4NDAwOgorCQkJcHJpbnRmKCI1ViAiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODAwOgorCQkJcHJpbnRmKCIzLjNWICIpOworCQkJYnJlYWs7CisJCWNhc2UgMHhjMDA6CisJCQlwcmludGYoIjMuMy81ViAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJ1bnN1cHBvcnRlZCBWY2MgIik7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHNvY2tldF9zdGF0dXMgJiAweDMwKSB7CisJCWNhc2UgMHgxMDoKKwkJCXByaW50ZigiMTZiaXQgUEMtQ2FyZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAweDIwOgorCQkJcHJpbnRmKCIzMmJpdCBDYXJkQnVzIENhcmRcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIjhiaXQgUEMtQ2FyZFxuIik7CQkKKwkJCWJyZWFrOworCQl9CQorCX0KKwkKKwkKKwl3cml0ZWIoMHg0MSwgc29ja2V0X2Jhc2UgKyAweDgwNik7IC8qIEVuYWJsZSBJL08gd2luZG93IDAgYW5kIG1lbW9yeSB3aW5kb3cgMCAqLworCXdyaXRlYigweDBlLCBzb2NrZXRfYmFzZSArIDB4ODA3KTsgLyogUmVzZXQgSS9PIHdpbmRvdyBvcHRpb25zICovCisKKwkvKiBDYXJlZnVsOiB0aGUgbGludXggeWVudGEgZHJpdmVyIGRvIG5vdCBzZWVtIHRvIHJlc2V0IHRoZSBvZmZzZXQKKwkgKiBpbiB0aGUgaS9vIHdpbmRvd3MsIHNvIGxlYXZpbmcgdGhlbSBub24temVybyBpcyBhIHByb2JsZW0gKi8KKwkKKwl3cml0ZWIoaW9fYmFzZSAmIDB4ZmYsIHNvY2tldF9iYXNlICsgMHg4MDgpOyAvKiBJL08gd2luZG93IDAgYmFzZSBhZGRyZXNzICovCisJd3JpdGViKGlvX2Jhc2U+PjgsIHNvY2tldF9iYXNlICsgMHg4MDkpOworCXdyaXRlYigoaW9fYmFzZSArIGlvX2xlbiAtIDEpICYgMHhmZiwgc29ja2V0X2Jhc2UgKyAweDgwYSk7IC8qIEkvTyB3aW5kb3cgMCBlbmQgYWRkcmVzcyAqLworCXdyaXRlYigoaW9fYmFzZSArIGlvX2xlbiAtIDEpPj44LCBzb2NrZXRfYmFzZSArIDB4ODBiKTsKKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgzNik7ICAgICAgLyogSS9PIHdpbmRvdyAwIG9mZnNldCBhZGRyZXNzIDB4MDAwICovCQkJCSAgICAgCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MzcpOworCisJCisJd3JpdGViKChwY21jaWFfY2lzX3B0ciYweDAwMGZmMDAwKSA+PiAxMiwgCisJICAgICAgIHNvY2tldF9iYXNlICsgMHg4MTApOyAvKiBNZW1vcnkgd2luZG93IDAgc3RhcnQgYWRkcmVzcyBiaXRzIDE5LTEyICovCisJd3JpdGViKChwY21jaWFfY2lzX3B0ciYweDAwZjAwMDAwKSA+PiAyMCwgCisJICAgICAgIHNvY2tldF9iYXNlICsgMHg4MTEpOyAgLyogTWVtb3J5IHdpbmRvdyAwIHN0YXJ0IGFkZHJlc3MgYml0cyAyMy0yMCAqLworCXdyaXRlYigoKHBjbWNpYV9jaXNfcHRyK2Npc19sZW4tMSkgJiAweDAwMGZmMDAwKSA+PiAxMiwgCisJCXNvY2tldF9iYXNlICsgMHg4MTIpOyAvKiBNZW1vcnkgd2luZG93IDAgZW5kIGFkZHJlc3MgYml0cyAxOS0xMiovCisJd3JpdGViKCgocGNtY2lhX2Npc19wdHIrY2lzX2xlbi0xKSAmIDB4MDBmMDAwMDApID4+IDIwLCAKKwkJc29ja2V0X2Jhc2UgKyAweDgxMyk7IC8qIE1lbW9yeSB3aW5kb3cgMCBlbmQgYWRkcmVzcyBiaXRzIDIzLTIwKi8KKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxNCk7IC8qIE1lbW9yeSB3aW5kb3cgMCBvZmZzZXQgYml0cyAxOS0xMiAqLyAKKwl3cml0ZWIoMHg0MCwgc29ja2V0X2Jhc2UgKyAweDgxNSk7IC8qIE1lbW9yeSB3aW5kb3cgMCBvZmZzZXQgYml0cyAyMy0yMCBhbmQgCisJCQkJCSAgICAqIG9wdGlvbnMgKHJlYWQvd3JpdGUsIGF0dHJpYnV0ZSBhY2Nlc3MpICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTYpOyAvKiBFeENBIGNhcmQtZGV0ZWN0IGFuZCBnZW5lcmFsIGNvbnRyb2wgICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MWUpOyAvKiBFeENBIGdsb2JhbCBjb250cm9sIChpbnRlcnJ1cHQgbW9kZXMpICovCisJCisJd3JpdGViKChwY21jaWFfY2lzX3B0ciAmIDB4ZmYwMDAwMDApID4+IDI0LCAKKwkgICAgICAgc29ja2V0X2Jhc2UgKyAweDg0MCk7IC8qIE1lbW9yeSB3aW5kb3cgYWRkcmVzcyBiaXRzIDMxLTI0ICovCisKKwkJCisJLyogdHVybiBvZmYgdm9sdGFnZSAqLworCWlmICh2b2x0YWdlX3NldChzbG90LCAwLCAwKSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBFbmFibGUgZXh0ZXJuYWwgaGFyZHdhcmUgKi8KKwlpZiAoaGFyZHdhcmVfZW5hYmxlKHNsb3QpKSB7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAoY2hlY2tfaWRlX2RldmljZShzbG90LCBpZGVfYmFzZV9idXMpKSB7CisJCXJldHVybiAxOworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKK3N0YXRpYyBpbnQgcGNtY2lhX29mZiAodm9pZCkKK3sKKwlpbnQgc2xvdCA9IDA7CisJCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MDYpOyAvKiBkaXNhYmxlIGFsbCBJL08gYW5kIG1lbW9yeSB3aW5kb3dzICovCisJCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MDgpOyAvKiBJL08gd2luZG93IDAgYmFzZSBhZGRyZXNzICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MDkpOworCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBhKTsgLyogSS9PIHdpbmRvdyAwIGVuZCBhZGRyZXNzICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MGIpOworCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM2KTsgLyogSS9PIHdpbmRvdyAwIG9mZnNldCBhZGRyZXNzICAqLwkJCQkgICAgIAorCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODM3KTsKKwkKKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgwYyk7IC8qIEkvTyB3aW5kb3cgMSBiYXNlIGFkZHJlc3MgICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MGQpOworCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBlKTsgLyogSS9PIHdpbmRvdyAxIGVuZCBhZGRyZXNzICAqLworCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODBmKTsKKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgzOCk7IC8qIEkvTyB3aW5kb3cgMSBvZmZzZXQgYWRkcmVzcyAgKi8JCQkJICAgICAKKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgzOSk7CisJCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTApOyAvKiBNZW1vcnkgd2luZG93IDAgc3RhcnQgYWRkcmVzcyAqLworCXdyaXRlYigweDAwLCBzb2NrZXRfYmFzZSArIDB4ODExKTsKKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxMik7IC8qIE1lbW9yeSB3aW5kb3cgMCBlbmQgYWRkcmVzcyAgKi8KKwl3cml0ZWIoMHgwMCwgc29ja2V0X2Jhc2UgKyAweDgxMyk7CisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTQpOyAvKiBNZW1vcnkgd2luZG93IDAgb2Zmc2V0ICovCisJd3JpdGViKDB4MDAsIHNvY2tldF9iYXNlICsgMHg4MTUpOworCQorCXdyaXRlYigweGMwLCBzb2NrZXRfYmFzZSArIDB4ODQwKTsgLyogTWVtb3J5IHdpbmRvdyAwIHBhZ2UgYWRkcmVzcyAqLworCisKKwkvKiB0dXJuIG9mZiB2b2x0YWdlICovCisJdm9sdGFnZV9zZXQoc2xvdCwgMCwgMCk7CisKKwkvKiBkaXNhYmxlIGV4dGVybmFsIGhhcmR3YXJlICovCisJcHJpbnRmICgiU2h1dGRvd24gYW5kIFBvd2Vyb2ZmIFRpIFBDSTE0MTBBXG4iKTsKKwloYXJkd2FyZV9kaXNhYmxlKHNsb3QpOworCQorCXJldHVybiAwOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisjZGVmaW5lCU1BWF9UVVBFTF9TWgk1MTIKKyNkZWZpbmUgTUFYX0ZFQVRVUkVTCTQKK2ludCBpZGVfZGV2aWNlc19mb3VuZDsKK3N0YXRpYyBpbnQgY2hlY2tfaWRlX2RldmljZShpbnQgc2xvdCwgaW50IGlkZV9iYXNlX2J1cykKK3sKKwl2b2xhdGlsZSB1Y2hhciAqaWRlbnQgPSBOVUxMOworCXZvbGF0aWxlIHVjaGFyICpmZWF0dXJlX3BbTUFYX0ZFQVRVUkVTXTsKKwl2b2xhdGlsZSB1Y2hhciAqcCwgKnN0YXJ0OworCWludCBuX2ZlYXR1cmVzID0gMDsKKwl1Y2hhciBmdW5jX2lkID0gfjA7CisJdWNoYXIgY29kZSwgbGVuOworCXVzaG9ydCBjb25maWdfYmFzZSA9IDA7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgaTsKKwl1MzIgc29ja2V0X3N0YXR1czsKKworCWRlYnVnICgiUENNQ0lBIE1FTTogJTA4WFxuIiwgcGNtY2lhX2Npc19wdHIpOworCQorCXNvY2tldF9zdGF0dXMgPSByZWFkbChzb2NrZXRfYmFzZSs4KTsKKwkKKwlpZiAoKHNvY2tldF9zdGF0dXMgJiA2KSAhPSAwIHx8IChzb2NrZXRfc3RhdHVzICYgMHgyMCkgIT0gMCkgeworCQlwcmludGYoIm5vIGNhcmQgb3IgQ2FyZEJ1cyBjYXJkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCXN0YXJ0ID0gcCA9ICh2b2xhdGlsZSB1Y2hhciAqKSBwY21jaWFfY2lzX3B0cjsKKworCXdoaWxlICgocCAtIHN0YXJ0KSA8IE1BWF9UVVBFTF9TWikgeworCisJCWNvZGUgPSAqcDsgcCArPSAyOworCisJCWlmIChjb2RlID09IDB4RkYpIHsgLyogRW5kIG9mIGNoYWluICovCisJCQlicmVhazsKKwkJfQorCisJCWxlbiA9ICpwOyBwICs9IDI7CisjaWYgZGVmaW5lZChERUJVRykgJiYgKERFQlVHID4gMSkKKwkJeyAKKwkJCXZvbGF0aWxlIHVjaGFyICpxID0gcDsKKwkJCXByaW50ZiAoIlxuVHVwbGUgY29kZSAlMDJ4ICBsZW5ndGggJWRcblx0RGF0YToiLAorCQkJCWNvZGUsIGxlbik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJCXByaW50ZiAoIiAlMDJ4IiwgKnEpOworCQkJCXErPSAyOworCQkJfQorCQl9CisjZW5kaWYJLyogREVCVUcgKi8KKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgQ0lTVFBMX1ZFUlNfMToKKwkJCWlkZW50ID0gcCArIDQ7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfRlVOQ0lEOgorCQkJLyogRml4IGZvciBicm9rZW4gU2FuRGlzayB3aGljaCBtYXkgaGF2ZSAweDgwIGJpdCBzZXQgKi8KKwkJCWZ1bmNfaWQgPSAqcCAmIDB4N0Y7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfRlVOQ0U6CisJCQlpZiAobl9mZWF0dXJlcyA8IE1BWF9GRUFUVVJFUykKKwkJCQlmZWF0dXJlX3Bbbl9mZWF0dXJlcysrXSA9IHA7CisJCQlicmVhazsKKwkJY2FzZSBDSVNUUExfQ09ORklHOgorCQkJY29uZmlnX2Jhc2UgPSAoKihwKzYpIDw8IDgpICsgKCoocCs0KSk7CisJCQlkZWJ1ZyAoIlxuIyMgQ29uZmlnX2Jhc2UgPSAlMDR4ICMjI1xuIiwgY29uZmlnX2Jhc2UpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcCArPSAyICogbGVuOworCX0KKworCWZvdW5kID0gaWRlbnRpZnkoaWRlbnQpOworCisJaWYgKGZ1bmNfaWQgIT0gKCh1Y2hhcil+MCkpIHsKKwkJcHJpbnRfZnVuY2lkIChmdW5jX2lkKTsKKworCQlpZiAoZnVuY19pZCA9PSBDSVNUUExfRlVOQ0lEX0ZJWEVEKQorCQkJZm91bmQgPSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsJLyogbm8gZGlzayBkcml2ZSAqLworCX0KKworCWZvciAoaT0wOyBpPG5fZmVhdHVyZXM7ICsraSkgeworCQlwcmludF9maXhlZChmZWF0dXJlX3BbaV0pOworCX0KKworCWlmICghZm91bmQpIHsKKwkJcHJpbnRmKCJ1bmtub3duIGNhcmQgdHlwZVxuIik7CisJCXJldHVybiAxOworCX0KKwkKKwkvKiBzZWxlY3QgY29uZmlnIGluZGV4IDEgKi8KKwl3cml0ZWIoMSwgcGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSk7CQorCisjaWYgMAorCXByaW50ZigiQ29uZml1cmF0aW9uIE9wdGlvbiBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSkpOworCXByaW50ZigiQ2FyZCBDb25maXVyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSArIDIpKTsKKwlwcmludGYoIlBpbiBSZXBsYWNlbWVudCBSZWdpc3RlciBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSArIDQpKTsKKwlwcmludGYoIlNvY2tldCBhbmQgQ29weSBSZWdpc3RlcjogJTAyeFxuIiwgcmVhZGIocGNtY2lhX2Npc19wdHIgKyBjb25maWdfYmFzZSArIDYpKTsKKyNlbmRpZgkKKwlpZGVfZGV2aWNlc19mb3VuZCB8PSAoMSA8PCAoc2xvdCtpZGVfYmFzZV9idXMpKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgdm9sdGFnZV9zZXQoaW50IHNsb3QsIGludCB2Y2MsIGludCB2cHApCit7CisJdTMyIHNvY2tldF9jb250cm9sOworCWludCByZWc9MDsKKwkKKwlzd2l0Y2ggKHNsb3QpIHsKKwljYXNlIDA6CisJCXJlZyA9IHNvY2tldF9iYXNlICsgMHgxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorCQorCXNvY2tldF9jb250cm9sID0gMDsKKwkKKwkKKwlzd2l0Y2ggKHZjYykgeworCWNhc2UgNTA6CisJCXNvY2tldF9jb250cm9sIHw9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgMzM6CisJCXNvY2tldF9jb250cm9sIHw9IDB4MzA7CisJCWJyZWFrOworCWNhc2UgMDoKKwlkZWZhdWx0OgorCX0KKwkKKwlzd2l0Y2ggKHZwcCkgeworCWNhc2UgMTIwOgorCQlzb2NrZXRfY29udHJvbCB8PSAweDE7CisJCWJyZWFrOworCWNhc2UgNTA6CisJCXNvY2tldF9jb250cm9sIHw9IDB4MjsKKwkJYnJlYWs7CisJY2FzZSAzMzoKKwkJc29ja2V0X2NvbnRyb2wgfD0gMHgzOworCQlicmVhazsKKwljYXNlIDA6CisJZGVmYXVsdDoKKwl9CisKKwl3cml0ZWwoc29ja2V0X2NvbnRyb2wsIHJlZyk7CisJCisJZGVidWcgKCJ2b2x0YWdlX3NldDogVGkgUENJMTQxMEEgU2xvdCAlZCwgVmNjPSVkLiVkLCBWcHA9JWQuJWRcbiIsCisJCXNsb3QsIHZjYy8xMCwgdmNjJTEwLCB2cHAvMTAsIHZwcCUxMCk7CisJCisJdWRlbGF5KDUwMCk7CisJcmV0dXJuIDA7Cit9CisKKwkKK3N0YXRpYyBpbnQgaGFyZHdhcmVfZW5hYmxlKGludCBzbG90KQoreworCXUzMiBzb2NrZXRfc3RhdHVzOworCXUxNiBicmdfY3RybDsKKwlpbnQgaXNfODIzNjVzbDsKKwkKKwlzb2NrZXRfc3RhdHVzID0gcmVhZGwoc29ja2V0X2Jhc2UrOCk7CisJCisJaWYgKChzb2NrZXRfc3RhdHVzICYgNikgPT0gMCkgeworCQkKKwkJc3dpdGNoIChzb2NrZXRfc3RhdHVzICYgMHgzYzAwKSB7CisJCQkKKwkJY2FzZSAweDQwMDoKKwkJCXByaW50ZigiNVYgIik7CisJCQl2b2x0YWdlX3NldChzbG90LCA1MCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAweDgwMDoKKwkJCXZvbHRhZ2Vfc2V0KHNsb3QsIDMzLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIDB4YzAwOgorCQkJdm9sdGFnZV9zZXQoc2xvdCwgMzMsIDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl2b2x0YWdlX3NldChzbG90LCAwLCAwKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJdm9sdGFnZV9zZXQoc2xvdCwgMCwgMCk7CisJfQorCQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldmJ1c2ZuLCBQQ0lfQlJJREdFX0NPTlRST0wsICZicmdfY3RybCk7CisJYnJnX2N0cmwgJj0gflBDSV9CUklER0VfQ1RMX0JVU19SRVNFVDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2YnVzZm4sIFBDSV9CUklER0VfQ09OVFJPTCwgYnJnX2N0cmwpOworCWlzXzgyMzY1c2wgPSAoKHJlYWRiKHNvY2tldF9iYXNlKzB4ODAwKSAmIDB4MGYpID09IDIpOyAKKwl3cml0ZWIoaXNfODIzNjVzbD8weDkwOjB4OTgsIHNvY2tldF9iYXNlKzB4ODAyKTsKKwl3cml0ZWIoMHg2Nywgc29ja2V0X2Jhc2UrMHg4MDMpOworCXVkZWxheSgxMDAwMDApOworI2lmIDAJCisJcHJpbnRmKCJFeENBIElkICUwMngsIENhcmQgU3RhdHVzICUwMngsIFBvd2VyIGNvbmZpZyAlMDJ4LCBJbnRlcnJ1cHQgQ29uZmlnICUwMngsIGJyaWRnZSBjb250cm9sICUwNHggJWRcbiIsIAorCSAgICAgICByZWFkYihzb2NrZXRfYmFzZSsweDgwMCksIHJlYWRiKHNvY2tldF9iYXNlKzB4ODAxKSwKKwkgICAgICAgcmVhZGIoc29ja2V0X2Jhc2UrMHg4MDIpLCByZWFkYihzb2NrZXRfYmFzZSsweDgwMyksIGJyZ19jdHJsLCBpc184MjM2NXNsKTsKKyNlbmRpZgkKKwkKKwlyZXR1cm4gKChyZWFkYihzb2NrZXRfYmFzZSsweDgwMSkmMHg2Yyk9PTB4NmMpPzA6MTsKK30KKworCisKK3N0YXRpYyBpbnQgaGFyZHdhcmVfZGlzYWJsZShpbnQgc2xvdCkKK3sKKwl2b2x0YWdlX3NldChzbG90LCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZnVuY2lkKGludCBmdW5jKQoreworCXB1dHMoaW5kZW50KTsKKwlzd2l0Y2ggKGZ1bmMpIHsKKwljYXNlIENJU1RQTF9GVU5DSURfTVVMVEk6CisJCXB1dHMoIiBNdWx0aS1GdW5jdGlvbiIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfTUVNT1JZOgorCQlwdXRzKCIgTWVtb3J5Iik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9TRVJJQUw6CisJCXB1dHMoIiBTZXJpYWwgUG9ydCIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfUEFSQUxMRUw6CisJCXB1dHMoIiBQYXJhbGxlbCBQb3J0Iik7CisJCWJyZWFrOworCWNhc2UgQ0lTVFBMX0ZVTkNJRF9GSVhFRDoKKwkJcHV0cygiIEZpeGVkIERpc2siKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNUUExfRlVOQ0lEX1ZJREVPOgorCQlwdXRzKCIgVmlkZW8gQWRhcHRlciIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfTkVUV09SSzoKKwkJcHV0cygiIE5ldHdvcmsgQWRhcHRlciIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfQUlNUzoKKwkJcHV0cygiIEFJTVMgQ2FyZCIpOworCQlicmVhazsKKwljYXNlIENJU1RQTF9GVU5DSURfU0NTSToKKwkJcHV0cygiIFNDU0kgQWRhcHRlciIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwdXRzKCIgVW5rbm93biIpOworCQlicmVhazsKKwl9CisJcHV0cygiIENhcmRcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHByaW50X2ZpeGVkKHZvbGF0aWxlIHVjaGFyICpwKQoreworCWlmIChwID09IE5VTEwpCisJCXJldHVybjsKKworCXB1dHMoaW5kZW50KTsKKwkKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSBDSVNUUExfRlVOQ0VfSURFX0lGQUNFOgorCQl7ICAgdWNoYXIgaWZhY2UgPSAqKHArMik7CisJCQkKKwkJCXB1dHMgKChpZmFjZSA9PSBDSVNUUExfSURFX0lOVEVSRkFDRSkgPyAiIElERSIgOiAiIHVua25vd24iKTsKKwkJCXB1dHMgKCIgaW50ZXJmYWNlICIpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIENJU1RQTF9GVU5DRV9JREVfTUFTVEVSOgorCWNhc2UgQ0lTVFBMX0ZVTkNFX0lERV9TTEFWRToKKwkJeworCQkJdWNoYXIgZjEgPSAqKHArMik7CisJCQl1Y2hhciBmMiA9ICoocCs0KTsKKwkJCQorCQkJcHV0cygoZjEgJiBDSVNUUExfSURFX1NJTElDT04pID8gIiBbc2lsaWNvbl0iIDogIiBbcm90YXRpbmddIik7CisJCQkKKwkJCWlmIChmMSAmIENJU1RQTF9JREVfVU5JUVVFKSB7CisJCQkJcHV0cygiIFt1bmlxdWVdIik7CisJCQl9CisJCQkKKwkJCXB1dHMoKGYxICYgQ0lTVFBMX0lERV9EVUFMKSA/ICIgW2R1YWxdIiA6ICIgW3NpbmdsZV0iKTsKKwkJCQorCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfU0xFRVApIHsKKwkJCQlwdXRzKCIgW3NsZWVwXSIpOworCQkJfQorCQkJCisJCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19TVEFOREJZKSB7CisJCQkJcHV0cygiIFtzdGFuZGJ5XSIpOworCQkJfQorCQkJCisJCQlpZiAoZjIgJiBDSVNUUExfSURFX0hBU19JRExFKSB7CisJCQkJcHV0cygiIFtpZGxlXSIpOworCQkJfQorCQkJCisJCQlpZiAoZjIgJiBDSVNUUExfSURFX0xPV19QT1dFUikgeworCQkJCXB1dHMoIiBbbG93IHBvd2VyXSIpOworCQkJfQorCQkJCisJCQlpZiAoZjIgJiBDSVNUUExfSURFX1JFR19JTkhJQklUKSB7CisJCQkJcHV0cygiIFtyZWcgaW5oaWJpdF0iKTsKKwkJCX0KKwkJCQorCQkJaWYgKGYyICYgQ0lTVFBMX0lERV9IQVNfSU5ERVgpIHsKKwkJCQlwdXRzKCIgW2luZGV4XSIpOworCQkJfQorCQkJCisJCQlpZiAoZjIgJiBDSVNUUExfSURFX0lPSVMxNikgeworCQkJCXB1dHMoIiBbSU9pczE2XSIpOworCQkJfQorCQkJCisJCQlicmVhazsKKwkJfQorCX0KKwlwdXRjKCdcbicpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUFYX0lERU5UX0NIQVJTCQk2NAorI2RlZmluZQlNQVhfSURFTlRfRklFTERTCTQKKworc3RhdGljIHVjaGFyICprbm93bl9jYXJkc1tdID0geworCSJBUkdPU1kgUG5QSURFIEQ1IiwKKwlOVUxMCit9OworCitzdGF0aWMgaW50IGlkZW50aWZ5KHZvbGF0aWxlIHVjaGFyICpwKQoreworCXVjaGFyIGlkX3N0cltNQVhfSURFTlRfQ0hBUlNdOworCXVjaGFyIGRhdGE7CisJdWNoYXIgKnQ7CisJdWNoYXIgKipjYXJkOworCWludCBpLCBkb25lOworCisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsJLyogRG9uJ3Qga25vdyAqLworCQorCXQgPSBpZF9zdHI7CisJZG9uZSA9MDsKKwkKKwlmb3IgKGk9MDsgaTw9NCAmJiAhZG9uZTsgKytpLCBwKz0yKSB7CisJCXdoaWxlICgoZGF0YSA9ICpwKSAhPSAnXDAnKSB7CisJCQlpZiAoZGF0YSA9PSAweEZGKSB7CisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkqdCsrID0gZGF0YTsKKwkJCWlmICh0ID09ICZpZF9zdHJbTUFYX0lERU5UX0NIQVJTLTFdKSB7CisJCQkJZG9uZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwICs9IDI7CisJCX0KKwkJaWYgKCFkb25lKQorCQkJKnQrKyA9ICcgJzsKKwl9CisJKnQgPSAnXDAnOworCXdoaWxlICgtLXQgPiBpZF9zdHIpIHsKKwkJaWYgKCp0ID09ICcgJykgeworCQkJKnQgPSAnXDAnOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcHV0cyhpZF9zdHIpOworCXB1dGMoJ1xuJyk7CisKKwlmb3IgKGNhcmQ9a25vd25fY2FyZHM7ICpjYXJkOyArK2NhcmQpIHsKKwkJZGVidWcgKCIjIyBDb21wYXJlIGFnYWluc3QgXCIlc1wiXG4iLCAqY2FyZCk7CisJCWlmIChzdHJjbXAoKmNhcmQsIGlkX3N0cikgPT0gMCkgewkvKiBmb3VuZCEgKi8KKwkJCWRlYnVnICgiIyMgQ0FSRCBGT1VORCAjI1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsJLyogZG9uJ3Qga25vdyAqLworfQorCisjZW5kaWYgLyogQ09ORklHX0lERV9USV9DQVJEQlVTICovCg==